/**
 * StringUtils.java - Fonctions en plus pour les String
 * 
 * @author BOURGE Denis
 * @version 1.0
 */

package utils;

import java.text.Normalizer;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;

public class StringUtils {

	/**
	 * Enlève l'accent d'un caractère avec accent
	 * 
	 * @param s
	 *            Chaîne (d'un caractère)
	 * @return Le caractère sans accent
	 */
	public static char unAccent(String s) {

		String temp = Normalizer.normalize(s, Normalizer.Form.NFD);
		Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
		return pattern.matcher(temp).replaceAll("").charAt(0);
	}

	/**
	 * Teste si le caractère c est dans la chaîne s
	 * 
	 * @param c
	 *            Le caractère
	 * @param s
	 *            La chaîne
	 * @return Si c'est dedans
	 */
	public static boolean estDans(char c, String s) {

		boolean retour = false;

		for (int i = 0; i < s.length(); i++) {
			if (c == s.charAt(i)) retour = true;
		}

		return retour;
	}

	/**
	 * Minimise et enlève les accents d'une chaîne
	 * 
	 * @param s
	 *            Une chaîne
	 * @return La chaîne normalisée
	 */
	public static String normalizeWord(String s) {

		String alphabet = "abcdefghijklmnopqrstuvwxyz";
		String tmp = new String();
		int i = 0;

		while (i != s.length()) {
			char t = StringUtils.unAccent(Character.toString(Character.toLowerCase(s.charAt(i))));
			if (StringUtils.estDans(t, alphabet)) {
				tmp += t;
			}
			i++;
		}

		return new String(tmp);
	}

	/**
	 * Fonction principale (de test)
	 * 
	 * @param args
	 *            Argument en ligne de commande
	 */
	public static void main(String[] args) {

		String mot = "aé'(-ée";
		String nouvMot = StringUtils.normalizeWord(mot);

		System.out.println(mot + " (taille: " + mot.length() + ")");
		System.out.println("=> " + nouvMot + " (taille: " + nouvMot.length() + ")");

		String mmot = "eeeeef";
		List<String> listeMots = anagrammes(mmot);
		for (String x : listeMots) {
			System.out.println(x);
		}
	}

	/**
	 * Utilise la fonction genererAnagramme pour récupérer une liste
	 * d'anagrammes du mot passé en paramètre
	 * 
	 * @param s
	 *            Mot dont on souhaite connaître les anagrammes
	 * @return Les anagrammes
	 */
	public static List<String> anagrammes(String s) {

		List<String> listeLettres = new ArrayList<String>();
		List<String> listeMots = null;

		for (int i = 0; i < s.length(); i++) {
			listeLettres.add(String.valueOf(s.charAt(i)));
		}
		listeMots = genererAnagramme(listeLettres);

		return listeMots;
	}

	/**
	 * Fonction genererAnagramme, récupérée sur le SDZ. Source:
	 * http://www.siteduzero.com/forum-83-814840-p1-java-anagramme.html
	 * 
	 * @param t
	 *            Liste de caractères (convertis en String) qui composent un mot
	 * @return Les anagrammes
	 */
	private static List<String> genererAnagramme(List<String> t) {

		String racine;
		List<String> ch = new ArrayList<String>();
		List<String> h = new ArrayList<String>();
		List<String> result = new ArrayList<String>();
		LinkedList<String> ret = new LinkedList<String>();

		int i = 0;
		int a = 0;

		if (t.size() == 1) {
			return t;

		} else {
			for (i = 0; i < t.size(); i++) {
				racine = t.get(i);
				if (ret.indexOf(racine) >= 0) {
				} else {
					ret.add(racine);
					h.clear();
					h.addAll(t);
					h.remove(i);

					a = result.size();
					ch = genererAnagramme(h);
					result.addAll(ch);

					for (int j = a; j < result.size(); j++) {
						result.set(j, racine + result.get(j));
					}
				}
			}

			return result;
		}

	}
}